home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / covern.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  4KB  |  186 lines

  1. /* covern.c 左右のカバーを開けて斜め弾 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../shot.h"
  7. #include "../enemy.h"
  8. #include "../eshot.h"
  9. #include "../effect.h"
  10. #include "../psearch.h"
  11. #include "../sound.h"
  12.  
  13. #define PALET_MAIN    0x0700
  14.  
  15. /* 関数プロトタイプ宣言 */
  16. static short EnemyMoveCoverN (ENEMY *);
  17. static void EnemyFreeCoverN (ENEMY *);
  18.  
  19.  
  20. /* 初期化ルーチン */
  21. void EnemyAllocCoverN (ENEMY * p)
  22. {
  23.     /* 左右どちらから出現したか */
  24.     if (SHORT_LX < 144)
  25.         p->vx = 8192;
  26.     else
  27.         p->vx = -8192;
  28.     p->vy = 2 * 65536;
  29.  
  30.     p->pt = obj_covern;
  31.     p->info = PALET_MAIN | PRIORITY_BOSS;
  32.     p->hit_sx = 24;        /* 自機ショットに対する当たり判定 */
  33.     p->hit_sy = 12;
  34.     p->hp = 48;        /* 耐久力 */
  35.     p->damage = 0;
  36.     p->flash = 0;
  37.  
  38.     p->damage_mode = DAMAGE_PIERCE;
  39.     p->func_enemy_move = EnemyMoveCoverN;
  40.     p->func_enemy_free = EnemyFreeCoverN;
  41.  
  42.     /* コア関連 */
  43.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  44.     p->core_pt = sp_core;
  45.  
  46.     p->m_work = 0;
  47. }
  48.  
  49.  
  50. /* 移動ルーチン */
  51. /* 返り値:非0なら消去 */
  52. static short EnemyMoveCoverN (ENEMY * p)
  53. {
  54.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  55.     p->x = (p->lx += p->vx) >> 16;
  56.     p->y = (p->ly += p->vy) >> 16;
  57.  
  58.     switch (p->m_work) {
  59.  
  60.     case 0:
  61.         if (p->y > 48)
  62.             p->m_work++;
  63.         break;
  64.  
  65.     case 1:
  66.         if (p->vy > 16384)
  67.             p->vy -= 4096;
  68.         else
  69.             p->m_work++;
  70.         break;
  71.  
  72.         /* カバーを開ける */
  73.     case 2:
  74.         p->pt++;
  75.         if (p->pt == obj_covern + 14) {        /* カバー開ききったら */
  76.             p->m_work++;
  77.             p->s_work = 0;
  78.             p->s_work2 = 5;        /* 斜め弾速度初期値 */
  79.             p->s_work3 = ESHOT_NRG03;    /* 斜め弾種類初期値 */
  80.             p->s_work4 = 0;        /* 斜め弾角度 */
  81.             SoundSetSE (SE_LOCK);
  82.             break;
  83.         }
  84.         break;
  85.  
  86.         /* カバーが開いたので弾を撃つ */
  87.     case 3:
  88.         /* 攻撃処理 */
  89.  
  90.         switch (p->s_work++) {
  91. #define INTERVAL2    12
  92.         case INTERVAL2 * 1:
  93.         case INTERVAL2 * 2:
  94.         case INTERVAL2 * 3:
  95.             EshotAlloc (p->s_work3, p->x + 16, p->y + 1, p->s_work2, 64 - p->s_work4, 0);
  96.             EshotAlloc (p->s_work3, p->x - 16, p->y + 1, p->s_work2, 64 + p->s_work4, 0);
  97.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  98.             p->s_work2 += 2;
  99.             p->s_work3++;
  100.             p->s_work4 += 8;
  101.             break;
  102.         case INTERVAL2 * 7:
  103.             p->m_work++;
  104.             p->m_work2 = 0;
  105.             break;
  106.         default:
  107.             break;
  108.         }
  109.         break;
  110.  
  111.     case 4:        /* カバーを閉める */
  112.         if (p->m_work2++ > 10) {
  113.             if (p->pt > obj_covern) {
  114.                 p->pt--;
  115.             } else {
  116.                 /* 閉まりきったら */
  117.                 SoundSetSE (SE_LOCK);
  118.                 p->m_work++;
  119.             }
  120.         }
  121.         break;
  122.  
  123.         /* 撤退 */
  124.     case 5:
  125.         if (p->vy > -1 * 65536)
  126.             p->vy -= 4096;
  127.         /* 画面外に出たら消去 */
  128.         if (SHORT_LY < -32)
  129.             return (-1);    /* 消去 */
  130.         break;
  131.     }
  132.  
  133.  
  134.     /* もし前回ダメージを受けたなら */
  135.     if (p->damage) {
  136.         p->hp -= p->damage;
  137.         p->damage = 0;
  138.         SoundSetSE (SE_DAMAGE);        /* 敵ダメージ音 */
  139.  
  140.         /* 白(or赤)フラッシュ処理 */
  141.         if (p->info == (PALET_MAIN | PRIORITY_BOSS)) {
  142.             if (p->hp < HP_PALET_RED)
  143.                 p->info = PALET_RED | PRIORITY_BOSS;
  144.             else
  145.                 p->info = PALET_DAMAGE | PRIORITY_BOSS;
  146.         } else {
  147.             p->info = PALET_MAIN | PRIORITY_BOSS;
  148.         }
  149.  
  150.  
  151.         /* 耐久力が0以下なら消去 */
  152.         if (p->hp <= 0) {
  153.             EffectAlloc (EFFECT_EXPL, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  154.             EffectAlloc (EFFECT_POINTS, POINTS_1200, p->x, p->y);    /* 得点を出現させる */
  155.             SoundSetSE (SE_EXPL_M);        /* 中ボス爆発音 */
  156.             return (-1);
  157.         }
  158.     } else {
  159.         /* 耐久力が少なくなったら赤フラッシュ */
  160.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < HP_PALET_RED)) {
  161.             p->info = PALET_RED | PRIORITY_BOSS;
  162.             if (p->flash > TIMER_FLASH_NORMAL)
  163.                 p->flash = 0;
  164.         } else {
  165.             p->info = PALET_MAIN | PRIORITY_BOSS;
  166.         }
  167.     }
  168.     xobj_set_st (p);    /* 表示 */
  169.  
  170.     /* コアの表示 */
  171.     p->core_x = p->x - 8;
  172.     p->core_y = p->y - 12;
  173.     xsp_set_st (&(p->core_x));
  174.  
  175.     return (0);
  176. }
  177.  
  178.  
  179. /* 消去ルーチン */
  180. static void EnemyFreeCoverN (ENEMY * p)
  181. {
  182.     /* 刺さったショットの処理 */
  183.     if ((p->shot) && (p->shot->enemy) && (p->shot->enemy == p))
  184.         p->shot->status = SHOT_STATUS_NON;
  185. }
  186.